(*****************************************************************

			анализ правила:
   <описание переменных>::={<имя  переменной>:<имя типа>;}

******************************************************************)
procedure opis;
Var
kem:integer;
tmp:byte;
BEGIN
 case getkll of
  'D','L','R':begin
	       er('Ожидался BEGIN',2);
	      end;
	  'S':if getnit=1 then begin end
	       else
		begin
		 er('Ожидался BEGIN',2);
		end;
     { То,ради чего и написанна эта процедура }
  'I':Begin  {I}
	repeat	       { пока не BEGIN }
	 settpname;
	 nextl;
	 if (getkll<>'R') or (getnit<>10)
	   then er('Ожидался разделитель `:`',2)
	    else
	      Begin {type name}
	       nextl;
	       if (getkll<>'S') then er('Ожидалось имя типа',2)
		else
		  case getnit of
		   3: settpnext('B',1,' ');{byte}
		   4: settpnext('I',2,' ');{integer}
		   5: settpnext('C',1,' ');{char}
		   6:begin  {dim}
		      nextl;
		      if (getkll<>'R') or (getnit<>7)
		       then er('Ожидался разделитель `(`',2)
			else nextl;
		      if (getkll<>'D') then
			 er('Ожидалась десятичная константа',2)
			  else
			 begin
			  kem:=va+1;
			  nextl;
			 end;
		      if (getkll<>'R') or (getnit<>8)
		       then er('Ожидался разделитель `)`',2)
			else nextl;
		      if (getkll<>'S') or (getnit<>16)
		       then er('Ожидался OF',2)
			else nextl;
		      if (getkll<>'S')
			then
			  er('Ожидалось имя базового типа ',2);
			case getnit of
			 3:settpnext('DB',kem,' ');	{of byte}
			 4:settpnext('DI',kem*2,' '); {of integer}
			 5:settpnext('DC',kem,' ');   {of char}
			 else er('Ожидалось имя базового типа ',2);
			end  {case}
		     end;   {dim}
		   7:begin  {file}
		       if (getkll<>'S') or (getnit<>7)
			  then er('Ожидался FILE',2)
			    else nextl;
		       if (getkll<>'S') or (getnit<>16)
			  then er('Ожидался OF',2)
			    else nextl;
		       if (getkll<>'S')
			then
			  er('Ожидалось имя базового типа ',2);
			case getnit of
			 3:settpnext('FB',2,'C');   {of byte}
			 4:settpnext('FI',2,'C');   {of integer}
			 5:settpnext('FC',2,'C');   {of char}
			 else er('Ожидалось имя базового типа ',2);
			end  {case}
		     end;   {file}
		   else
		     er('Ожидалось имя типа',2)
		   end {case}
	       End;   {type name}
	  nextl;
	   if (getkll<>'R') or (getnit<>6) then
	     er('Ожидался разделитель `;`',2);
	   nextl;
	   if (getkll<>'I') and
	     ((getkll<>'S') or (getnit<>1))
	      then er('Ожидался BEGIN',2);
	 until (getkll='S') and (getnit=1);
       End;   {I}
 end; { case }
 {------------------------------------}
 {string constant}
 i:=1;
 while length(tab_str[i])>0 do
  begin
   ts[i].iname:=i;
   ts[i].size:=length(tab_str[i]);
   ts[i].addr:=adp;
   adp:=adp+length(tab_str[i]);
   i:=i+1;
  end; {while}
 {------------------------------------}
   gendatbyte($e9);		{JMP code}
   gendatword(adp-$103);
 {####### ГЕНЕРАЦИЯ ДАННЫХ #########}
   for i:=1 to 81 do
	gendatbyte(printmc[i]); {PRINT CONSTANT}
   for i:=1 to 215 do
	gendatbyte(inputkc[i]); {INPUT CONSTANT}
   for i:=1 to 67 do
	gendatbyte(testbyte[i]); {test range byte}
   for i:=1 to 11 do
	gendatbyte(enter[i]); {** RETURN **}
   for i:=1 to 15 do
	gendatbyte(inpchar[i]); {** enter CHAR **}
   for i:=1 to 53 do
	gendatbyte(testdim[i]); {** test range dim **}
   for i:=1 to 49 do
	gendatbyte(testint[i]); {** test signum integer **}
   for i:=1 to 60 do
	gendatbyte(opentest[i]); {** open/create file test **}
   for i:=1 to 114 do
	gendatbyte(testIO[i]); {** I/O file test **}
   for i:=1 to 3 do
	gendatbyte(0); {** data area **}
   i:=1;
   while tp[i].iname<>0 do
    begin
      for r:=1 to tp[i].size do gendatbyte(0);
     i:=i+1;
    end; {while}
 {** строки **}
 i:=1;
 while length(tab_str[i])>0 do
  begin
   for r:=1 to length(tab_str[i]) do
    begin
     gendatbyte(ord(tab_str[i][r]));
    end;
   i:=i+1;
  end; {while}
 {####################################}
END;